home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Graphics Programming (2nd Edition) / Visual Basic Graphics Programming 2nd Edition.iso / Src / Ch10 / Flake.frm (.txt) < prev    next >
Visual Basic Form  |  1999-06-08  |  6KB  |  190 lines

  1. VERSION 5.00
  2. Begin VB.Form frmFlake 
  3.    Caption         =   "Flake"
  4.    ClientHeight    =   4335
  5.    ClientLeft      =   2280
  6.    ClientTop       =   900
  7.    ClientWidth     =   5070
  8.    LinkTopic       =   "Form1"
  9.    PaletteMode     =   1  'UseZOrder
  10.    ScaleHeight     =   4335
  11.    ScaleWidth      =   5070
  12.    Begin VB.TextBox txtTheta 
  13.       Height          =   285
  14.       Left            =   600
  15.       MaxLength       =   3
  16.       TabIndex        =   1
  17.       Text            =   "60"
  18.       Top             =   360
  19.       Width           =   375
  20.    End
  21.    Begin VB.TextBox txtDepth 
  22.       Height          =   285
  23.       Left            =   600
  24.       MaxLength       =   3
  25.       TabIndex        =   0
  26.       Text            =   "3"
  27.       Top             =   0
  28.       Width           =   375
  29.    End
  30.    Begin VB.PictureBox picCanvas 
  31.       AutoRedraw      =   -1  'True
  32.       Height          =   4335
  33.       Left            =   1080
  34.       ScaleHeight     =   285
  35.       ScaleMode       =   3  'Pixel
  36.       ScaleWidth      =   261
  37.       TabIndex        =   4
  38.       Top             =   0
  39.       Width           =   3975
  40.    End
  41.    Begin VB.CommandButton cmdGo 
  42.       Caption         =   "Go"
  43.       Default         =   -1  'True
  44.       Height          =   375
  45.       Left            =   240
  46.       TabIndex        =   2
  47.       Top             =   840
  48.       Width           =   615
  49.    End
  50.    Begin VB.Label Label1 
  51.       Caption         =   "Theta"
  52.       Height          =   255
  53.       Index           =   1
  54.       Left            =   0
  55.       TabIndex        =   5
  56.       Top             =   360
  57.       Width           =   495
  58.    End
  59.    Begin VB.Label Label1 
  60.       Caption         =   "Depth"
  61.       Height          =   255
  62.       Index           =   0
  63.       Left            =   0
  64.       TabIndex        =   3
  65.       Top             =   0
  66.       Width           =   495
  67.    End
  68. Attribute VB_Name = "frmFlake"
  69. Attribute VB_GlobalNameSpace = False
  70. Attribute VB_Creatable = False
  71. Attribute VB_PredeclaredId = True
  72. Attribute VB_Exposed = False
  73. Option Explicit
  74. Private Const PI = 3.14159
  75. ' Coordinates of the points in the initiator.
  76. Private Const NUM_INITIATOR_POINTS = 3
  77. Private InitiatorX(0 To NUM_INITIATOR_POINTS) As Single
  78. Private InitiatorY(0 To NUM_INITIATOR_POINTS) As Single
  79. ' Angles and distances for the generator.
  80. Private Const NUM_GENERATOR_ANGLES = 4
  81. Private ScaleFactor As Single
  82. Private GeneratorDTheta(1 To NUM_GENERATOR_ANGLES) As Single
  83. ' Draw the complete snowflake.
  84. Private Sub DrawFlake(ByVal depth As Integer, ByVal length As Single)
  85. Dim i As Integer
  86. Dim x1 As Single
  87. Dim y1 As Single
  88. Dim x2 As Single
  89. Dim y2 As Single
  90. Dim dx As Single
  91. Dim dy As Single
  92. Dim theta As Single
  93.     picCanvas.Cls
  94.     ' Draw the snowflake.
  95.     For i = 1 To NUM_INITIATOR_POINTS
  96.         x1 = InitiatorX(i - 1)
  97.         y1 = InitiatorY(i - 1)
  98.         x2 = InitiatorX(i)
  99.         y2 = InitiatorY(i)
  100.         dx = x2 - x1
  101.         dy = y2 - y1
  102.         theta = ATan2(dy, dx)
  103.         DrawFlakeEdge depth, x1, y1, _
  104.             theta, length
  105.     Next i
  106. End Sub
  107. ' Recursively draw a snowflake edge starting at
  108. ' (x1, y1) in direction theta and distance dist.
  109. ' Leave the coordinates of the endpoint in
  110. ' (x1, y1).
  111. Private Sub DrawFlakeEdge(ByVal depth As Integer, ByRef x1 As Single, ByRef y1 As Single, ByVal theta As Single, ByVal dist As Single)
  112. Dim status As Integer
  113. Dim i As Integer
  114. Dim x2 As Single
  115. Dim y2 As Single
  116.     If depth <= 0 Then
  117.         x2 = x1 + dist * Cos(theta)
  118.         y2 = y1 + dist * Sin(theta)
  119.         picCanvas.Line (x1, y1)-(x2, y2)
  120.         x1 = x2
  121.         y1 = y2
  122.         Exit Sub
  123.     End If
  124.     ' Recursively draw the edge.
  125.     dist = dist * ScaleFactor
  126.     For i = 1 To NUM_GENERATOR_ANGLES
  127.         theta = theta + GeneratorDTheta(i)
  128.         DrawFlakeEdge depth - 1, x1, y1, theta, dist
  129.     Next i
  130. End Sub
  131. Private Sub CmdGo_Click()
  132. Dim depth As Integer
  133. Dim length As Single
  134. Dim theta As Single
  135. Dim unit As Single
  136. Dim vunit As Single
  137. Dim hunit As Single
  138.     picCanvas.Cls
  139.     MousePointer = vbHourglass
  140.     DoEvents
  141.     ' Get the parameters.
  142.     If Not IsNumeric(txtDepth.Text) Then txtDepth.Text = "5"
  143.     depth = CInt(txtDepth.Text)
  144.     ' Initialize the generator.
  145.     If Not IsNumeric(txtTheta.Text) Then txtTheta.Text = "60"
  146.     theta = CInt(txtTheta.Text) / 180 * PI
  147.     ' See how big we can make the curve.
  148.     vunit = 0.8 * picCanvas.ScaleHeight / (Sqr(3) * 4 / 3)
  149.     hunit = 0.8 * picCanvas.ScaleWidth / 2
  150.     If vunit < hunit Then
  151.         unit = vunit
  152.     Else
  153.         unit = hunit
  154.     End If
  155.     length = 2 * unit
  156.     ' Initialize the generator and initializer.
  157.     InitializeGenerator theta, length
  158.     ' Draw the snowflake.
  159.     DrawFlake depth, length
  160.     MousePointer = vbDefault
  161. End Sub
  162. ' Initialize the generator for the indicated angle.
  163. Private Sub InitializeGenerator(ByVal theta As Single, ByVal length As Single)
  164. Dim xmid As Single
  165. Dim ymid As Single
  166.     ' Initialize the initiator's coordinates.
  167.     xmid = picCanvas.ScaleWidth / 2
  168.     ymid = picCanvas.ScaleHeight / 2
  169.     InitiatorX(1) = xmid + length / 2
  170.     InitiatorY(1) = ymid - length / 2 * Sqr(3) / 3
  171.     InitiatorX(2) = xmid - length / 2
  172.     InitiatorY(2) = InitiatorY(1)
  173.     InitiatorX(3) = xmid
  174.     InitiatorY(3) = ymid + length / 2 * Sqr(3) * 2 / 3
  175.     InitiatorX(0) = InitiatorX(3)
  176.     InitiatorY(0) = InitiatorY(3)
  177.     ScaleFactor = 1 / (2 * (1 + Cos(theta)))
  178.     GeneratorDTheta(1) = 0
  179.     GeneratorDTheta(2) = theta
  180.     GeneratorDTheta(3) = -2 * theta
  181.     GeneratorDTheta(4) = theta
  182. End Sub
  183. Private Sub Form_Resize()
  184. Dim wid As Single
  185.     ' Make the picCanvas as big as possible.
  186.     wid = ScaleWidth - picCanvas.Left
  187.     If wid < 120 Then wid = 120
  188.     picCanvas.Move picCanvas.Left, 0, wid, ScaleHeight
  189. End Sub
  190.